package com.xiaoshuidi.cloud.module.rooms.utils;

import java.math.BigDecimal;

/**
 * @Author Feng
 * @date 2023/5/29
 */
public class PVUtil {

    /**
     * @param rate 各期利率
     * @param nper 年金的付款总期数
     * @param pmt  每期的付款金额
     * @param fv   未来值
     * @param type 数字0|1，用以指定各期的付款时间是在期初还是期末
     * @return
     */
    public static double pv(double rate, double nper, double pmt, double fv, double type) {
        // 如果年化率收益率为0， month rate 作分母会出现 NaN错误，需要对年化利率为零进行特殊处理
        if (rate == 0) {
            return nper * pmt;
        }
        double result = -(fv + pmt * (1 + (rate / 12) * type) * ((Math.pow(1 + (rate / 12), nper) - 1) / (rate / 12))) / Math.pow(1 + (rate / 12), nper);
        return BigDecimal.valueOf(result).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static double fv(double rate, double nper, double pmt, double pv, double type) {
        if (rate == 0) {
            return nper * pmt;
        }
        BigDecimal powers = BigDecimal.valueOf(Math.pow(1 + (rate / 12), nper));
        double fv = -1 * (pv * powers.doubleValue() + pmt * (1 + (rate / 12) * type) * ((powers.doubleValue() - 1) / (rate / 12)));
        return BigDecimal.valueOf(fv).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static void main(String[] args) {
        double pv = Math.abs(fv(0.045, 3, -2077.97, 2077.97 * 3, 1));
        System.out.println(pv);
    }
}
